#include <iostream>
#include <string>
#include <memory>

class Fruit{
public:
    Fruit(){}
    virtual void name() = 0;
};

class Apple : public Fruit{
public:
    Apple(){}
    void name() override
    {
        std::cout << "我是苹果！" << std::endl;
    }
};

class Banana : public Fruit{
public:
    Banana(){}
    void name() override
    {
        std::cout << "我是香蕉！" << std::endl;
    }
};

class FruitFactory{
public:
    virtual std::shared_ptr<Fruit> create() = 0;
};

class AppleFactory : public FruitFactory{
public:
    std::shared_ptr<Fruit> create() override
    {
        return std::make_shared<Apple>();
    }
};

class BananaFactory : public FruitFactory{
public:
    std::shared_ptr<Fruit> create() override
    {
        return std::make_shared<Banana>();
    }
};

int main()
{
    // 先创建一个一个指向FruitFactory的指针
    // 虽然这里不能创建抽象类的实例，但是可以创建指向抽象类的指针
    // 这里创建的是一个指向AppleFactory类型的实例的智能指针对象，这个智能指针的类型是FruitFactory
    // tmp作为一个类型为FruitFactory的指针，可以触发多态，
    // 不同类中的create将创建出指向不同类型对象的fruit
    std::shared_ptr<FruitFactory> tmp(new AppleFactory());
    std::shared_ptr<Fruit> fruit = tmp->create();
    fruit->name();

    // 通过reset可以让tmp这个智能指针改指向，改成指向BananaFactory类型的实例
    tmp.reset(new BananaFactory());
    fruit = tmp->create();
    fruit->name();

    return 0;
}
